AVReAl Описание Адаптеры History FAQ English Russian

AVReAl - описание программы

Программа компилируется в следующих вариантах

Для работы WIN32 версии необходимы
W95/W98 - DLportIO.DLL
NT4,W2000,WinXP - DLportIO.DLL и DLportIO.sys

Это файлы из комплекта DriverLINX от Scientific Software Tools, Inc. (http://www.sstnet.com). С некоторых пор этот драйвер перестал поддерживаться и исчез с основной страницы фирмы.
В сокращённом виде без описания и множественных примеров применения можно взять тут dlportio.zip (170KB).
В некоторых случаях могут быть проблемы с установкой сокращённой версии под WinXP (возможно, начиная с какого-то сервис-пака, так как под WinXPsp1 нормально устанавливался и сокращённый вариант). В таком случае следует взять полную версию инсталлятора (1.5МБ).
Применение WIN32 версии фактически имеет смысл только под NT, Win2000, WinXP, когда DOS-программа не имеет доступа к портам. Под W95/W98 нормально работает и DOS-версия.

Программа AVReAl предназначена для программирования микроконтроллеров серии AVR фирмы Atmel в режиме ISP (in-cirсuit serial programming, последовательное программирование в схеме). Т.е. на плату устройства устанавливаются штыри, к которым впоследствии подключается шлейфик от программатора (подключение LPT к контроллеру рассмотрено в разделе "адаптеры"). По окончании процесса программирования снимается сигнал сброса и процессор начинает выполнять зашитую в него программу.

В режиме "fbprg" незадействованные выходы данных LPT могут быть использованы как питание (ключ -ap).

При использовании буферированных адаптеров (Altera ByteBlaster, Atmel STK*00) программа рассчитана на шитьё в плате с "родными" питанием и кварцем.

Также возможна генерация XTAL программой (ключ -o0), данный режим может оказаться полезен и при наличии кварца в плате (LPT-порт легко его пересилит) для "обхода" ошибок кристалов "не читается содержимое EEPROM данных при частотах кварца, близких к максимальной".

Принимает INTEL HEX (avrasm -i). Загружает HEX в память не в массив, а в список. Т.е. различается ситуация "байт 0xFF в .hex" и "неупомянутый байт" В результате есть возможность шить только то, что надо, остальное только проверять при необходимости (см. ключ -v+).

Для любителей корректировать прошивку прямо по HEX-файлу: если не совпадает контрольная сумма строки, то задается вопрос - "игнорировать?". При ответе 'Y' (или 'y') эта и все остальные ошибки CSUM игнорируются (но сами символы контрольной суммы должны присутствовать, иначе программа закончит работу еще раньше по недопустимому символу в строке).
Для облегчения такого редактирования (особенно "форматных" записей в EEPROM) реализована возможность, подсмотренная у программы от VMK для программирования PIC через Tait-совместимое железо: перед анализом строки из нее убираются пробелы и табуляции. В итоге можно дать:

  :08 0001 00   00 01 0203 0405 0 6 0 7    DB
Также игнорируются пустые строки и строки, начинающиеся с символа '#', последнее предназначено для помещения комментариев о версии непосредственно в HEX-файлы.

Проверяется верхний адрес в HEX-файле, если не влазит в опознанный кристалл, то никаких действий (кроме выдачи сообщения об ошибке) не производится.
Проверяется перекрытие адресов записей в HEX файле. При нахождении первого перекрытия производится выход из программы с указанием диапазона адресов перекрывающихся данных.

Для кристаллов с объёмом ПЗУ более 64KB необходим расширенный формат HEX-файла (обычный не поддерживает объем больше 64KB). Запись прочитанных данных в файл всегда производится с дополнительными записями тип '04' - Extended Linear Address Record, как не имеющим разночтений. Чтение из HEX-файла записей типа '02' Extended Segment Address Record производится в соответствии с формированием их в AVRASM by Atmel (без предусмотренного документацией Intel сворачивания адреса смещения по модулю 64Kb).


ВЫЗОВ

avreal [ключи] [[-c] имя_файла_кода [[-d] имя_файла_данных]]
 или
avreal [ключи] -d имя_файла_данных   (когда код трогать желания нет)
Если есть только имена файлов, но нет относящихся к ним ключей (-r -w -v), то файлы игнорируются. Подробнее про работу с файлами и про ключи -c, -d рассказано после описания остальных ключей.

Ключи

-h (-?)
выдать ключи и перечень поддерживаемых кристаллов. Команда
   avreal +имя -h 
(+имя должен быть задан раньше ключа -h) выдает список fuses, поддерживаемых в режиме ISP для заданного контроллера.

+имя
установить тип кристалла, имя допускается задавать как с префиксом 'AT', так и без него, в том виде, в котором имена выдаются по -h. Регистр букв не важен. Например, at90s1200, attiny22l, atmega103 либо 90s1200, tiny22l, mega103. Обязательный ключ, никаких действий по умолчанию не производится. Если задан только тип (больше нет ни ключей, ни имен файлов), то контроллер будет сброшен и выдана информация о нем (наличие, если есть доступные по ISP fuses - их состояние).

-p<порт>[,<скорость>]
порт
Для DOS, WIN32, LINUX - шестнадцатеричное число
1,2,3 - номер LPT порта, >0x100 - базовый адрес порта. Если задан номер - адрес из BIOS MEMORY (не работает для win32 и linux версий, там принято, что LPT1/2/3 это 278/378/3BC). Адрес и в виде -p3BC, и в виде -p0x3BC воспринимается как шестнадцатеричное число. По умолчанию -p2 (LPT2)
Для FreeBSD - имя устройства для параллельного порта, например, /dev/ppi0
скорость необязательный параметр, число с плавающей точкой, время обращения к порту в микросекундах.
если указан, то не производится настройка на скорость порта, время обращения принимается равным заданному числу. В win32, linux, FreeBSD версиях настройка не производится никогда, если не указано - считается, что обращение к порту не быстрее 1мкс


-a<буква>
группа ключей "адаптер"
-ab
работа через Altera ByteBlaster (включая ByteBlasterMV, ByteBlaster-II)
-as
работа через адаптер Atmel STK*00
-aa
автоматический выбор ByteBlaster/STK
-ax
XILINX parallel download cable
-az
пытаться переводить выходы LPT в Z-состояние для "отключения" программатора от схемы ("byte-blaster для ленивых", работает в "FBPRG" режиме)
-ar
инверсия полярности сброса (например, для подачи его через резистор в базу присутствующего в схеме транзистора)
-ap
подавать питание через свободные выходы данных LPT (несовместимо с -ab,-as) Рекомендуется поближе к кристаллу установить блокировочный конденсатор по питанию [Andy Chernyshenko]
-am=mapfile.txt
использовать файл mapfile.txt для задания конфигурации адаптера программирования (см. ниже)
-ai#
установить время неактивного Reset после стирания равным # ms. Необходимо устанавливать большим времени задержки снятия сброса присутствующим в схеме супервизором.


-o<число>
Задать частоту установленного кварца для настройки скорости SPI. Частота допускается с плавающей точкой и единицами измерения частоты Hz, kHz, MHz, например,
   -o3.686MHZ
   -o14745600hz
При отсутствии единиц измерения для совместимости с предыдущими версиями считается, что частота в килогерцах. При отсутствии ключа частота по умолчанию 800 (0.8MHz)
-o0[,<число>] означает необходимость генерации XTAL из программы. Можно указать дополнительный делитель для генерации более меделнного сигнала SCK, что необходимо для работы ключа -o0 с кристаллами с прошитым CKDIV. Допустимые значения делителя #=1..32
У STK*00 для генерации XTAL используется линия LED. ByteBlaster (ByteBlasterMV) должен быть несколько доработан. ByteBlaster-II уже имеет подключение к выводу 8 колодки. XILINX parallel download cable не имеет свободных линий и ключ -o0 не может быть с ним использован.

-n[<число>]
Использовать последние 2 байта кода как счетчик стираний. Если указано <число>, то для записи счетчика используется оно, а не инкрементированное прочитанное значение. При -e -w -n если последние 2 байта заняты кодом, то -n игнорируется.

-e[-]
Стереть
'-' задаёт сохранение содержимого EEPROM способом прочесть/стереть/записать. Для кристаллов, имеющих fuse EESAVE, по -e- также применяется этот способ. Если же хочется пользоваться имеющимся fuse EESAVE, следует установить его (-feesv=0) отдельным запуском avreal и применять обычную форму ключа -e.

-1,-2,-3,-4,-5
Увеличить задержки на программирование в 1.5, 2, 3, 4, 5 раз соответственно (для программирования при пониженном напряжении)

-b{b|c}
Проверить на чистоту.
-b код и данные
-bc только код
-bd только данные


-r
Прочитать из контроллера в файл[ы]

-w[+][p]
Записать в контроллер файлы кода/данных, заданные в командной строке fuses.
'+' - если кристалл в этом задании не стирался и задана запись в EEPROM, то прописать FF в ячейки EEPROM, не заданные в HEX. Верификация этих ячеек на значение FF будет производиться даже если был задан просто -v, а не -v+ (мы же эти ячейки писали). Автоматическое стирание не производится по -w, используйте -ew для нестёртого кристалла.
'p' - использовать поллинг для определения конца записи. Если в течении времени, равного восьмикратному номинальному времени записи, поллинг не даёт положительного результата - выдаётся сообщение об ошибке и происходит завершение работы программы.

-v[+]
Верифицировать (только то, что есть в hex). Дополнительный '+' вызывает проверку на FF "свободных" с точки зрения HEX-файла позиций

-l[+]#
Установить уровень защиты # = 1 or 2.
При наличии '+' lock биты прошиваются до зашивки fuses (необходимо для включения BODEN и залочки 90s4433 в одном цикле подачи питания)

-f<fuselist>
список fuses для тех контроллеров, в которых они шьются по ISP. <fuselist> выглядит как fusename=value,fusename=value,bytename=value... где value - ШЕСТНАДЦАТЕРИЧНОЕ значение без префиксов и суффиксов. Для однобитовых fuse добавлены значения ON и OFF (прошить и стереть, 0 и 1 соответственно).
ВНИМАНИЕ! Начиная с версии 1.23 НЕ ПОДДЕРЖИВАЮТСЯ однобуквенные синонимы для fuses.
При наличии "пересекающихся" name=val выдается сообщение об ошибке. Перечень fusename для конкретного кристалла с диапазоном value и комментарием можно получить при помощи
   avreal +chipname -?
Для сокращения строки возможно задание полного байта fuses при помощи специальных имен bytename, представляющие собой названия байтов по документации с лидирующим подчерком: _low,_high,_ext,_lock. Нереализованные в данном байте биты рекомендуется устанавливать в '1'. Имя _lock относится к байту lock-битов и BLB, однако на состояние lock-битов не влияет. Для блокировки кристалла по прежнему надо использовать ключ -l. Допускается комбинация отдельных fuse и байтов, однако они при этом не должны пересекаться, т.е. каждый байт fuses должен быть задан либо только через специальное имя, либо только через имена отдельных fuse. Например,
    допустимо:     -f_low=C3,_high=F4,blb2=1
    недопустимо:   -f_lock=F7,blb2=1
Если работа с fuses по SPI поддерживается, то их состояние сообщается при любой операции с кристаллом, задание ключа -f необязательно. Fuses программируются или верифицируются указанием ключа -w или -v совместно с ключом -f (в том числе в одном сеансе с программированием/верификацией кода или данных).
Неупомянутые fuse остаются неизменными (кроме битов защиты boot-блока BLB, так как они могут быть стёрты по -e независимо от ключа -f). Группа BLB относится скорее к lock-битам, записать 1 поверх уже запрограммированной в 0 fuse невозможно. Если запрошена такая операция и контроллер не стирался, то программа завершает работу с соответствующим предупреждением.
AVReAl обеспечивает также расширенную поддержку osccal.
Внимание! У некоторых контроллеров SPIEN и RSTDSBL могут быть запрограммированы через ISP. Будьте осторожны, SPIEN по умолчанию запрограммировано, ключ -fspien=1 (-fspien=off) сотрет SPIEN и запретит дальнейшее низковольтное программирование. То же произойдет и при программировании RSTDSBL (-frstdsbl=0 или -frstdsbl=on).

-%
Выдавать по ходу дела дополнительную информацию (производимые действия и ответы контроллера). Внутри .bat файлов следует писать -%% (пожалуй, это был неудачный выбор - символ, имеющий особый смысл в bat-файлах, но меняться уже не будет).

-!
Делать, что велено, даже если контроллер не распознан (или распознан "не так", как задано в +name) а также если не обнаружен указанный в командной строке адаптер. Попытка стереть нераспознанный (возможно просто залоченный) кристалл при наличии команды стирания производится и без -!, после чего проводится повторное детектирование типа.

возможны осмысленные комбинации:

-v -w       записать, проверить
-e- -w -v+  стереть с сохранением EEPROM, записать, верифицировать
            с проверкой на чистоту свободных участков.
-b -w       проверить на чистоту, если грязная - выход, иначе писать
ВНИМАНИЕ! в связи с усложнением форматов ключей во избежание разночтений в дальнейшем возможность указывать группу ключей одним аргументом (например, -ewv) может быть исключена

После ключа -d идет имя файла данных, после -c имя кода, в этом случае порядок файлов не важен. Пробел между ключами -c/-d и именами не обязателен, т.е. допустимо как -cfoo.hex так и -c foo.hex. Если дано два имени файла без ключей -c и -d, то первое имя - файл кода, второе - файл данных (EEPROM).
Если имя одно и нет ключей -c/-d, то этот файл содержит данные для кода и, если он содержит информацию после верхнего адреса FLASH для заданного кристалла, то эта информация используется для программирования EEPROM данных. Т.е. если, например, для 90s2313 hex-файл содержал данные в адресах от 0x800 до 0x87F, то эти данные будут записаны в EEPROM по адресам 0x00-0x7F.

Порядок ключей не важен, выполнение производится в порядке E B W V L. Если проверка (B, V) дала отрицательный результат, то дальнейшая работа не производится. Т.е.

   -e -b -w -v -l2
означает: стереть, если стёрлось - писать, если верифицировалась - залочить.
   +tiny12 -w -c foo.hex -c*osccal=1f3 -fcksel=3,boden=0
Для tiny12 записать во флеш кода файл foo.hex, по адресу байта 0x1F3 занести прочитанное из контроллера значение OSCCAL, запрограммировать fuse boden и установить fuse CKSEL в бинарное значение 0011


Дополнительные возможности

Для занесения в код и/или данные специальных параметров применяются особые формы ключей -c и -d следующего вида:
-d*name=offset,ext - как байты в EEPROM данных
-c*name=offset,ext - как байты во FLASH кода (под команду LPM)
-с?name=offset,ext - как часть последовательных команд LDI начиная с offset
где
name
имя специального параметра, может состоять из собственно имени и уточняющего числа.
offset
адрес байта, начиная с которого производится запись специального значения, шестнадцатеричное значение без префиксов и суффиксов. Используется адрес байта, а не слова, в том числе и при обращении ко flash кода.
ext
дополнительный аргумент
Байты, необходимые для записи, должны существовать в исходном HEX-файле. В качестве специальных параметров могут выступать:

Значение калибровочного байта RC-генератора
В качестве имени используется слово osccal с номером калибровочного байта. При использовании нулевого байта OSCCAL указание номера 0 не обязательно. Дополнительный аргумент ext - корректирующее значение к прочитанной из кристалла величине OSCCAL (может быть необходимо при напряжении питания, отличающемся от напряжения калибровки на производстве). При выходе корректированного значения за пределы [0..255] происходит ограничение значения и выдача предупреждения.
Примеры.
1. Необходимо записать значение 3-го (считая с 0) байта osccal как байт по адресу 0x3F в EEPROM данных. Используется ключ

-d*osccal3=3F
2. Необходимо записать значение 0-го байта osccal, уменьшенное на 3, как часть команды LDI.
   public osccal_ldi
   ...
osccal_ldi:
   ldi R16,0xFF
   out OSCCAL,R16
   ...
Далее смотрим по MAP-файлу значение osccal_ldi, например оно вышло 0x120. Команда примет вид:
avreal +tiny12 -ewv -c foo.hex -c?osccal=120,-3

Серийный номер прибора
Предназначено для присвоения последовательных серийных номеров програмируемым изделиям. В качестве имени параметра используется слово serno с числом - длиной номера в байтах от 1 до 4. Серийный номер записывается в двоичном виде, младший байт записывается первым. Дополнительный аргумент ext - имя текстового файла, в котором записан номер в десятичном виде. После успешной записи в кристалл номер увеличивается на 1 и записывается назад в файл. Файл при этом переписывается полностью, если после серийного номера в нём была другая информация - она теряется. При сбое верификации при команде -w -v номер не меняется. Если в командной строке задана только верификация (без записи), то значение серийного номера из файла используется, но не инкрементируется, файл остаётся без изменений.
Примеры.
1. Необходимо записать значение 2-байтного серийного номера как 2 байта начиная с адреса 0x12 в EEPROM данных. Сам номер записан в файле serno.txt Используется ключ
 -d*serno2=12,serno.txt
2. Необходимо записать значение 3-байтового серийного номера как часть команд LDI. Номер записан в файле proj.serno
   public serno_load
   ...
serno_load:
   ldi R16,0xFF ; младший байт
   ldi R17,0xFF ; средний байт
   ldi R18,0xFF ; старший байт
Пусть значение serno_load по map-файлу вышло 0x120. Используется ключ:
 -c?serno3=120,proj.serno

Произвольная последовательность байтов
Предназначено для записи произвольных данных. В качестве имени параметра используется слово bytes с числом записываемых байтов. Дополнительный аргумент ext - шестнадцатеричная строка, число букв (hex-цифр) должно быть равно удвоенному числу байтов. Младший байт в hexstr должен быть расположен первым, т.е. для записи числа 0xDEADBEEF надо задать

  -c*bytes4=addr,EFBEADDE


ФОРМАТ ФАЙЛА КОНФИГУРАЦИИ АДАПТЕРА

Файл конфигурации позволяет задать соответствие сигналов ISP-программатора выводам LPT-порта, а также название адаптера, используемое при выводе диагностических сообщений. Файл состоит из отдельных записей вида параметр = значение по одной на строке.

Название адаптера (параметр 'name') задаётся записью

name = "произвольная строка"
Сигналы программатора (параметры mosi, miso, sck, reset, xtal) задаются записями вида
signal_name = [~]lpt_pin_name
Признак инверсии '~' означает, что между выводом LPT и выводом микроконтроллера присутствует инвертор. Внутренняя инверсия контроллера LPT учитывается автоматически. Допустимые имена выводов LPT: d0..d7 alf init strobe select ask busy error pe online. Внимание! В настоящее время для выходных сигналов программатора можно использовать только выводы d0..d7 порта LPT.

Существуют специальные группы выводов set, power, enable, в записях для этих групп допускается перечисление нескольких выводов LPT через запятую. Признак инверсии при каждом выводе означает, что на вывод необходимо выдать низкий уровень. Перед началом работы в заданное (активное) состояние устанавливаются выводы группы set. Затем активируются выводы группы power, выдерживается пауза около 0.3секунды и активируются выводы enable. По окончании работы в пассивное состояние переводятся выводы enable, затем выводы power. Выводы set остаются в установленном в начале состоянии.

Примеры описания адаптера для системы, состоящей из двух микроконтроллеров AVR, связанных между собой по SPI. Пусть контролеры соединены следующим образом:

При высокоимпедансном состоянии адаптера программирования или его отсутствии контроллеры могут свободно обмениваться информацией по последовательному интерфейсу.

Для программирования первого микроконтроллера необходимо использовать следующий конфигурационный файл.

name=1'st controller programmer
mosi=D6
miso=BUSY
sck = D0
reset = D1
enable=~ALF
set =~D3
Для программирования второго контроллера конфигурация адаптера должна быть следующая.
name=2'nd controller programmer
mosi=D6
miso=BUSY
set = ~D0
reset = D1
enable=~ALF
sck = D3


Возвращаемый ERRORLEVEL

0
Все заказанное сделано.
10
not blank при -b, несравнение при -v[+]
20
Невозможность осуществить запрошенную операцию.
HEX кода или данных слишком большой для распознанного типа контроллера.
Запрошенное для записи состояние BLB нельзя записать, не стерев контроллер (а команды стирания не было).
30
Не распознан конкретный тип (бывает при защищенном контроллере, поэтому при -e все равно делается попытка стереть и если после этого тоже не распознан - выход из программы)
40
Кабель программирования не подключен или не удалось войти в программирование по алгортиму для At90s.
50
Ошибка при чтении HEX-файла (не найден, "не те" символы, не совпала контрольная сумма, ошибка чтения, ...) или его записи (есть защищенный от перезаписи с таким же именем, ...).
60
Недостаточно памяти для списков кода/данных
70
Недопустимая командная строка (в т.ч. задан номер отсутствующего LPT)


Раздел "СВЕТЛОЕ БУДУЩЕЕ" убран в силу нехватки времени и изменения моих собственных потребностей. Коммунизм нам тоже когда-то обещали к 80 году, так что лучше я ничего обещать не буду, а вот если что-то интересное смогу, то будет сюрприз :-)

P.S. При обнаружении неприятностей просьба сообщать версию и очень желательно копию расширенной выдачи программы по -% (перенаправив выдачу в файл).
Внимание!!! Письма по поводу avreal с аттачами в виде скриншотов, WORD-овских и прочеофисовских документов и других способов переслать 1-килобайтный текст с помощью 100-килобайтного файла не будут даже читаться, не говоря уже об ответах